
/******************************************************************************
 *      Mestrado em Ciencia da Computacao - UFMS
 *		Redes de Computadores - Prof. Dr. Ronaldo Alves Ferreira
 *		Alunos: Geraldo Landre, Marcel Tolentino, Vinicius Bueno
 *****************************************************************************/
 /* reference: http://www.ime.usp.br/~pf/mac0122-2003/aulas/queue.html */

#ifndef TCBQUEUE_H
#define	TCBQUEUE_H

#include <semaphore.h>
#include "defines.h"

//////////////////////////////////////////////////////////
// Implementacao de uma fila (= queue)
// A fila sera representada por um registro do tipo int
// que tem dois campos: o endereco do inicio da fila e o
// endereco do fim da fila. Uma fila q sera considerada
// vazia se q->head == NULL. A fila propriamente dita sera
// uma lista encadeada com celulas do tipo int.
//////////////////////////////////////////////////////////

typedef struct cell_int{
   int              element;
   struct cell_int  *link;
} cell_int;

typedef struct {
   cell_int *head;
   cell_int *tail;
   int count;
   int max;
   sem_t sem_spaces;    // s1
   sem_t sem_items;     // s2
   bool available;
} sync_queue_int;

typedef struct {
   cell_int *head;
   cell_int *tail;
   int count;
   int max;
   sem_t mutex;
} queue_int;

void sync_remove_element(sync_queue_int *q, int element);
// Operacao de insercao: coloca element na fila q.
void sync_enqueue( sync_queue_int *q, int element);
// Operacao de remocao: retira um objeto da fila q e
// devolve o valor desse objeto.
int sync_dequeue( sync_queue_int *q);
// Cria uma fila vazia e devolve o endereco da nova fila.
sync_queue_int *sync_newqueue(u_short size);
// Libera o espaco ocupado pela fila q. A funcao supoe que
// o espaco apontado pelo campo element de cada celula da
// lista tenha sido alocado por malloc.
void sync_freequeue( sync_queue_int *q);
// Devolve 1 se a fila q esta vazia e 0 em caso contrario.
bool sync_queue_empty( sync_queue_int *q);
// Devolve o comprimento da fila q.
int sync_queue_length( sync_queue_int *q);
int sync_queue_full(sync_queue_int *q);
// for testing.
void print_sync_queue_status(sync_queue_int *q);


void remove_element(queue_int *q, int element);
// Operacao de insercao: coloca element na fila q.
void enqueue( queue_int *q, int element);
// Operacao de remocao: retira um objeto da fila q e
// devolve o valor desse objeto.
int dequeue( queue_int *q);
// Cria uma fila vazia e devolve o endereco da nova fila.
queue_int *newqueue(u_short size);
// Libera o espaco ocupado pela fila q. A funcao supoe que
// o espaco apontado pelo campo element de cada celula da
// lista tenha sido alocado por malloc.
void freequeue( queue_int *q);
// Devolve 1 se a fila q esta vazia e 0 em caso contrario.
bool queue_empty( queue_int *q);
// Devolve o comprimento da fila q.
int queue_length( queue_int *q);
int queue_full(queue_int *q);
// for testing.
void print_queue_status(queue_int *q);

#endif	/* TCBQUEUE_H */

